先前幾篇文章都在探討 ProductResource::make() 的 make() 的作用,這篇文章講解 『class ProductResource 的 toArray()』 怎麼被觸發的過程,過程猶如行徑 Laravel Request Lifecycle 請求的生命週期。
request 怎麼變成 Response 的過程,推薦 Laravel Request Lifecycle 請求的生命週期
一文,裡面的內容和圖片解說,很讚!
經作者同意,我引用文章中的 『Laravel Request Lifecycle 請求的生命週期』,如圖:
handle()
handle(),往 class Kernel 的父層 (class HttpKernel)
handle(),發現 $response 透過 sendRequestThroughRouter($request) 產生
sendRequestThroughRouter($request) 做什麼事? 經過 middleware 然後 dispatchToRouter()
dispatchToRouter() 追
$this->router 的 dispatch(),這個 $this->router 在 class HttpKernel __contruct() type hint 顯示是 class Router
dispatch()
dispatch(),要前往下一個 method dispatchToRoute($request)
runRoute() ,略過 findRoute(),runRoute() 如:
prepareResponse()
toResponse(): request 轉換為 response 的過程,種種的判斷式都在 toResponse() 內。
Responseable 很眼熟啊! Responseable 經常在 JsonResource 出現,咱們來去 JsonResource 看看從第四站 開始,我會把前面幾篇文章提到的 class ProductResource 帶入討論 (ps. class ProductResource 是 class JsonResource 的 子類別)

因此,從 class JsonResource 的 toResponse() 開始著手

class JsonResource,然而,在 route 或 Controller 經過 return ProductResource()::make() 後,$this 視作 class ProductResource 的 instance ( make() 作用,詳細參考 [Day 19] Laravel 的 XXXResource::make() 的 make() 作用 - new static())class ResourceResponse 底下,看看 toResponse() 的作用
json() 的格式如:
json() 格式:<?php
// $this->wrap(): 內容,表示的是 json 的 $data
public function json(
$data = [],
$status = 200,
array $headers = [],
$options = 0
)
$this->toArray() 就會去 call class ProductResource 的 public function toArray($request)
public/index.php ->
Kernel handle() 處理 request ->
處理 request 到對應的 route ->
派發 request 到配對的 route ->
預處理 response ->
request 轉為 response, 判斷 response 類別(Responseable, Stringable, Arrayable..等), 以及將 response 轉換成 JSON 格式 輸出
Responseable 與 JsonResource 關係 ->
『new ResourceResponse($this)->toResponse($request)』 ->
class ResourceResponse method toResponse() ->
返回 class JsonResource 的 resolve() ->
第四站 new ResourceResponse($this)解釋,此時的 $this 視作 class ProductResource ->
此時 $this->toArray(),就會去 call class ProductResource 的 public function toArray($request)
Laravel 底層把每個 method 都包得太好了,追程式的過程我忘記自己追到哪裡時,幸虧有 Laravel Request Lifecycle 做為指引,因此,迷失在程式大洋中時,我都會重新再看一次指引的地圖,在此感謝 Mia 提供的 Laravel Request Lifecycle 地圖 和 SoJ 作為嚮導。
1 Laravel Request Lifecycle 請求的生命週期
2 [Day 19] Laravel 的 XXXResource::make() 的 make() 作用 - new static()